MapStruct একটি শক্তিশালী এবং দক্ষ Java টুল যা ডোমেইন অবজেক্টের মধ্যে ডেটা ম্যাপিং সহজ করে তোলে। যদিও এটি কোড জেনারেশন প্রযুক্তি ব্যবহার করে, এর মাধ্যমে বিভিন্ন সমস্যা বা ত্রুটি দেখা দিতে পারে। তাই debugging এবং logging MapStruct ব্যবহারের গুরুত্বপূর্ণ অংশ হয়ে দাঁড়ায়, কারণ এটি আপনাকে ম্যাপিংয়ের মধ্যে সমস্যা চিহ্নিত করতে সহায়তা করে।
এই টিউটোরিয়ালে, আমরা MapStruct ব্যবহার করার সময় debugging এবং logging কিভাবে কার্যকরীভাবে করতে হবে, তা নিয়ে আলোচনা করব।
১. MapStruct Debugging এর ধারণা
MapStruct নিজেই একটি annotation processor যা কোড জেনারেট করে, তবে কখনো কখনো ম্যাপিংয়ে কোনো সমস্যা বা ত্রুটি দেখা দিতে পারে, যেমন টাইপ মিসম্যাচ, ডোমেইন অবজেক্টের ফিল্ড না মিলানো ইত্যাদি। তাই আপনাকে কিভাবে MapStruct কোড এবং ম্যাপিং সমস্যা debug করতে হয় তা জানা জরুরি।
Debugging Tips:
- MapStruct Generated Code দেখতে হবে:
- MapStruct compile-time এ কোড জেনারেট করে, আপনি এটি দেখতে পারেন। Maven এর মাধ্যমে বিল্ড করার পর target/generated-sources/annotations/ ফোল্ডারে MapStruct দ্বারা তৈরি কোড পাওয়া যাবে।
- এই কোডটি চেক করে আপনি দেখতে পারবেন কিভাবে MapStruct মেথডগুলো সম্পাদন করছে এবং কোথায় কোনো সমস্যা হতে পারে।
- MapStruct Annotation Processor Logging:
- আপনি MapStruct এর annotation processor এর লগিং সক্রিয় করতে পারেন, যাতে কোড জেনারেট হওয়ার সময় বিস্তারিত লগ দেখানো হয়।
- IDE Configuration:
- IntelliJ IDEA বা Eclipse ব্যবহার করার সময়, আপনি debug mode চালু করে দেখতে পারেন কোথায় MapStruct কোড সঠিকভাবে কাজ করছে না।
- IDE তে annotation processing সক্রিয় করতে হবে, যাতে MapStruct অ্যানোটেশন প্রসেসর চলতে থাকে এবং কোড জেনারেট করে।
২. MapStruct Logging
Logging MapStruct এর মধ্যে ম্যাপিংয়ের সমস্যা শনাক্ত করতে একটি গুরুত্বপূর্ণ হাতিয়ার। সাধারণত, MapStruct নিজে থেকে লগিং সরবরাহ করে না, তবে আপনি আপনার মডেল ম্যাপিংয়ের জন্য custom logging যুক্ত করতে পারেন।
Logging Setup:
MapStruct ব্যবহার করার সময় লগিং কনফিগারেশন করতে হলে আপনাকে কিছু কাস্টম কোডিং এবং টুলস ব্যবহার করতে হবে।
উদাহরণ: MapStruct Mapper Interface এ Logging যোগ করা
ধরা যাক, আপনি Person ডোমেইন অবজেক্ট এবং PersonDTO ডেটা ট্রান্সফার অবজেক্ট (DTO) এর মধ্যে ম্যাপিং করছেন এবং এই ম্যাপিংয়ের জন্য logging যোগ করতে চান। এটি MapStruct দ্বারা করা যাবে, কিন্তু Logger ব্যবহার করে।
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Mapper(componentModel = "spring")
public interface PersonMapper {
Logger logger = LoggerFactory.getLogger(PersonMapper.class);
@Mapping(source = "fullName", target = "name")
PersonDTO personToPersonDTO(Person person);
default PersonDTO personToPersonDTOWithLogging(Person person) {
logger.info("Mapping Person: {} to PersonDTO", person.getFullName());
PersonDTO dto = personToPersonDTO(person);
logger.info("Mapped PersonDTO: {}", dto.getName());
return dto;
}
}
এখানে, আমরা slf4j এর মাধ্যমে logger তৈরি করেছি এবং default method ব্যবহার করে লগিং মেসেজটি জেনারেট করেছি, যা ম্যাপিংয়ের আগে এবং পরে লগ করবে।
Spring Integration Example:
যদি আপনি Spring ব্যবহার করেন, তাহলে MapStruct ম্যাপিং ব্যবহারের সময় আপনার Spring logging কনফিগারেশন সঙ্গে চলে আসবে, এবং তা আপনার মডেল ম্যাপিংয়ের জন্য লগিং সক্রিয় করবে।
৩. MapStruct Debugging with Generated Code
MapStruct কোড জেনারেট করে, তাই কোডটির মধ্যে সমস্যা সনাক্ত করতে generated code দেখতে সাহায্য করতে পারে। MapStruct জেনারেট করা কোডের মধ্যে সমস্যাটি চিহ্নিত করা সহজ হয়ে ওঠে।
Step 1: Generated Code Location
- Maven বা Gradle ব্যবহার করলে, target/generated-sources/annotations/ ফোল্ডারে MapStruct দ্বারা তৈরি কোড পাওয়া যাবে।
- এখানে MapStruct এর তৈরি কোড দেখতে পাবেন এবং যেকোনো null pointer বা type mismatch সম্পর্কিত ত্রুটি শনাক্ত করতে পারবেন।
Step 2: Inspect Generated Code
MapStruct দ্বারা জেনারেট করা কোড সাধারণত নিচের মতো দেখাবে:
public class PersonMapperImpl implements PersonMapper {
@Override
public PersonDTO personToPersonDTO(Person person) {
if (person == null) {
return null;
}
PersonDTO personDTO = new PersonDTO();
personDTO.setName(person.getFullName()); // Example of field mapping
return personDTO;
}
}
এখানে, আপনি দেখতে পাবেন যে MapStruct কোড সঠিকভাবে প্রতিটি ফিল্ড ম্যাপিং করছে এবং এটি কীভাবে কাজ করছে।
Step 3: Debugging with Logs
MapStruct কোডে লগিং যুক্ত করতে, আপনি উপরোক্ত logging উদাহরণটি ব্যবহার করতে পারেন এবং ম্যাপিংয়ের পুরো প্রক্রিয়া ট্র্যাক করতে পারবেন।
৪. MapStruct Debugging: Common Issues and Fixes
Common Issues:
- Field Mismatch:
- যদি
sourceএবংtargetফিল্ডের নাম বা টাইপ ম্যাচ না করে, তবে MapStruct কোড জেনারেট করবে না। - Fix: ফিল্ড নাম বা টাইপ ঠিক করে দিন বা কাস্টম ম্যাপিং যুক্ত করুন।
- যদি
- NullPointerException:
- MapStruct null ভ্যালু হ্যান্ডলিং সঠিকভাবে করতে পারে না। আপনাকে default methods ব্যবহার করতে হবে।
- Fix: null checks যুক্ত করুন অথবা
@Mappingঅ্যানোটেশন দিয়ে nullValueCheckStrategy কনফিগার করুন।
- Missing Mapping for Nested Objects:
- Nested objects বা Complex Mapping ব্যবহারের সময় ম্যাপিং ফিল্ডগুলো ভুল হয়ে যেতে পারে।
- Fix: @Mapping অ্যানোটেশন দিয়ে কাস্টম ম্যাপিং বা default methods ব্যবহার করুন।
৫. MapStruct Debugging Tools
- Maven Build Output: Maven এর মাধ্যমে mvn clean install বা mvn clean compile কমান্ড চালিয়ে MapStruct কোড জেনারেটেড ফাইলগুলো চেক করা।
- IntelliJ IDEA Debugger: IntelliJ IDEA তে ডিবাগার ব্যবহার করে মেপিংয়ের মধ্যে কী ঘটছে তা পর্যবেক্ষণ করা যায়।
- Logback/SLF4J: MapStruct ম্যাপিংয়ের জন্য যদি লগিং কনফিগারেশন করা হয়, তবে Logback বা SLF4J ব্যবহার করে কোডের ম্যাপিং ট্র্যাক করা যায়।
সারাংশ
MapStruct Debugging এবং Logging হল গুরুত্বপূর্ণ কৌশল যা ম্যাপিংয়ের মধ্যে সমস্যা শনাক্ত করতে সাহায্য করে। MapStruct দ্বারা জেনারেট করা কোড এবং logging এর মাধ্যমে, আপনি আপনার কোডের কার্যকারিতা এবং ত্রুটিগুলি দ্রুত চিহ্নিত করতে পারবেন। SLF4J এবং Logback এর মাধ্যমে লগিং কনফিগার করা যায়, যা আপনাকে ম্যাপিং প্রক্রিয়া ট্র্যাক করতে এবং debug করতে সহায়তা করবে।
Read more